x86: virt_to_mfn() fixes.
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 31 Mar 2009 10:21:14 +0000 (11:21 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 31 Mar 2009 10:21:14 +0000 (11:21 +0100)
Signed-off-by: Xiaowei Yang <xiaowei.yang@intel.com>
xen/common/page_alloc.c
xen/include/asm-x86/x86_32/page.h
xen/include/asm-x86/x86_64/page.h

index 830e44cdb47e3a4c707ee3c10a999463e29368f1..ab3445b44bfe3f37b6ab0f88ae329d2992ecb6ca 100644 (file)
@@ -302,7 +302,8 @@ static unsigned long init_node_heap(int node, unsigned long mfn,
               (mfn + needed) <= (virt_to_mfn(DIRECTMAP_VIRT_END - 1) + 1) )
     {
         _heap[node] = mfn_to_virt(mfn);
-        avail[node] = mfn_to_virt(mfn + needed) - sizeof(**avail) * NR_ZONES;
+        avail[node] = mfn_to_virt(mfn + needed - 1) +
+                      PAGE_SIZE - sizeof(**avail) * NR_ZONES;
     }
 #endif
     else if ( get_order_from_bytes(sizeof(**_heap)) ==
index aef51f51af1d2f26726207c30ec143175fc8058b..648d96de87da45f18694ee280006bdc21970ad5b 100644 (file)
@@ -27,9 +27,6 @@
 #define __PAGE_OFFSET           (0xFF000000)
 #define __XEN_VIRT_START        __PAGE_OFFSET
 
-#define virt_to_maddr(va) ((unsigned long)(va)-DIRECTMAP_VIRT_START)
-#define maddr_to_virt(ma) ((void *)((unsigned long)(ma)+DIRECTMAP_VIRT_START))
-
 #define VADDR_BITS              32
 #define VADDR_MASK              (~0UL)
 
 #include <xen/config.h>
 #include <asm/types.h>
 
+static inline unsigned long __virt_to_maddr(unsigned long va)
+{
+    ASSERT(va >= DIRECTMAP_VIRT_START && va < DIRECTMAP_VIRT_END);
+    return va - DIRECTMAP_VIRT_START;
+}
+#define virt_to_maddr(va)       \
+    (__virt_to_maddr((unsigned long)(va)))
+
+static inline void *__maddr_to_virt(unsigned long ma)
+{
+    ASSERT(ma < DIRECTMAP_VIRT_END - DIRECTMAP_VIRT_START);
+    return (void *)(ma + DIRECTMAP_VIRT_START);
+}
+#define maddr_to_virt(ma)       \
+    (__maddr_to_virt((unsigned long)(ma)))
+
 /* read access (should only be used for debug printk's) */
 typedef u64 intpte_t;
 #define PRIpte "016llx"
index 8899fe777c935b1692dd22ad536a7a78e21c3757..fcfb8eef5775218b0d844a5e7f7c5bdc29dfad99 100644 (file)
@@ -46,8 +46,14 @@ static inline unsigned long __virt_to_maddr(unsigned long va)
 }
 #define virt_to_maddr(va)       \
     (__virt_to_maddr((unsigned long)(va)))
+
+static inline void *__maddr_to_virt(unsigned long ma)
+{
+    ASSERT(ma < DIRECTMAP_VIRT_END - DIRECTMAP_VIRT_START);
+    return (void *)(ma + DIRECTMAP_VIRT_START);
+}
 #define maddr_to_virt(ma)       \
-    ((void *)((unsigned long)(ma)+DIRECTMAP_VIRT_START))
+    (__maddr_to_virt((unsigned long)(ma)))
 
 /* read access (should only be used for debug printk's) */
 typedef u64 intpte_t;